package com.monkeyboy.utils;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 通过正则来验证手机号，身份证号
 * @author 
 * @version
 * */
public class ValidateUtil {
	
	/**
	 * 验证 15 - 19位身份证号码
	 * */
	private static final Pattern ID_CARD_PATTERN = Pattern.compile("(^[1-9]\\d{5}(18|19|([23]\\d))"
			+ "\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|(^[1-9]\\d{5}"
			+ "\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{2}[0-9Xx]$)"); 
	
	/**
	 * 验证手机号码
	 * 移动号码段:139、138、137、136、135、134、150、151、152、157、158、159、182、183、187、188、147
	 * 联通号码段:130、131、132、136、185、186、145
 	* 电信号码段:133、153、180、189
	 * */
	private static final Pattern PHONE_PATTERN = Pattern.compile("\\d{3}\\d{8}|\\d{4}-\\{7,8}|\\d{3}-\\d{8}"); 
	
	/**
	 * 收款账号验证
	 * */
	private static final Pattern PROCEEDS_ACCOUNT_PATTERN = Pattern.compile("^[0-9]*$");
	
	/**
	 * 验证匹配模式类
	 * */
	public static class Validate {
		/**
		 * 手机
		 * */
		public static final int MOBILE_PHONE = 0;
		/**
		 * 身份证
		 * */
		public static final int ID_CARD = 1;
		
		/**
		 * 收款账号
		 * */
		public static final int PROCEEDS_ACCOUNT = 2;
	}
	
	/**
	 * 根据模式验证字符串
	 * @throws Exception 
	 * */
	public static Map<String, Object> matcher(String regex, int type) throws Exception {
		Map<String, Object> reMap = new HashMap<>();
		reMap.put("state", true);
		Matcher matcher = null;
		if (type == Validate.ID_CARD) {
			if (regex == null || regex.trim().length() == 0) {
				reMap.put("state", false);
				reMap.put("msg", "身份证不能为空");
				return reMap;
			}
			matcher = ID_CARD_PATTERN.matcher(regex);
			if(!matcher.find()) {
				reMap.put("state", false);
				reMap.put("msg", "身份证输入错误");
				return reMap;
			}
			return reMap;
		}
		if (type == Validate.MOBILE_PHONE) {
			if (regex == null || regex.trim().length() == 0) {
				reMap.put("state", false);
				reMap.put("msg", "手机号码不能为空");
				return reMap;
			}
			matcher = PHONE_PATTERN.matcher(regex);
			if(!matcher.find()) {
				reMap.put("state", false);
				reMap.put("msg", "手机号码输入错误");
				return reMap;
			}
			return reMap;
		}
		if (type == Validate.PROCEEDS_ACCOUNT) {
			if (regex == null || regex.trim().length() == 0) {
				reMap.put("state", false);
				reMap.put("msg", "收款账号不能为空");
				return reMap;
			}
			matcher = PROCEEDS_ACCOUNT_PATTERN.matcher(regex);
			if(!matcher.find()) {
				reMap.put("state", false);
				reMap.put("msg", "收款账号只能为数字并且不能有空格");
				return reMap;
			}
			return reMap;
		}
		reMap.put("state", false);
		reMap.put("msg", "模式选择失败");
		return reMap;
	}
}
